﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TVL;
using System.Xml;
using General;

namespace TVLL5A
{
    public class SituacionL5A:Situacion
    {
        private const string _rutaxsd = "../../../TVLL5A/SituacionL5A.xsd";
        private string _err;
        private List<NPCL5A> _npcs;

        public SituacionL5A()
        {
            _err = "No";
            this._npcs = new List<NPCL5A>();
        }

        public SituacionL5A(string ruta)
        {
            _err = "No";
            this._npcs = new List<NPCL5A>();
            this.cargar(ruta);
        }

        public SituacionL5A(XmlElement nodo)
        {
            _err = "No";
            this._npcs = new List<NPCL5A>();
            this.cargar(nodo);
        }

        public string Fallo
        {
            get { return this._err; }
        }

        public List<NPCL5A> NPCS
        {
            get { return this._npcs; }
            set { this._npcs = value; }
        }

        public override void toXTVL(XmlTextWriter mixml)
        {
            mixml.WriteStartElement("situacion");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("desc", this.Descripcion);
            for (int i = 0; i < NPCS.Count; i++)
            {
                NPCS[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();
        }

        public override bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                this._err = validador.Fallo;
                return false;
            }
        }

        public override bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (!validador.validar())
            {
                this._err = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList nombre = xtvl.GetElementsByTagName("nombre");
                XmlNodeList desc = xtvl.GetElementsByTagName("desc");

                this.Nombre = nombre[0].InnerText;
                this.Descripcion = desc[0].InnerText;

                XmlNodeList npcs = xtvl.GetElementsByTagName("personaje");
                foreach (XmlElement nodo in npcs)
                {
                    if (nodo.GetAttribute("tipo") == "NPC")
                    {
                        NPCL5A nuevo = new NPCL5A(nodo);
                        NPCS.Add(nuevo);
                    }
                }
                return true;
            }
        }

        public override bool cargar(XmlElement nodo)
        {
            try
            {
                XmlNodeList nombre = nodo.GetElementsByTagName("nombre");
                XmlNodeList desc = nodo.GetElementsByTagName("desc");

                this.Nombre = nombre[0].InnerText;
                this.Descripcion = desc[0].InnerText;

                XmlNodeList npcs = nodo.GetElementsByTagName("personaje");
                foreach (XmlElement nod in npcs)
                {
                    NPCL5A nuevo = new NPCL5A(nod);
                    NPCS.Add(nuevo);
                }
                return true;
            }
            catch(Exception ex)
            {
                this._err = ex.Message;
                return false;
            }
        }
    }
}
